package com.currentcms.client.component.tree;

public interface Configuration<TreeNode>
{

	// ------------------------------------------------------------------------
	// rootLocation

	/**
	 * Identifies the sides of a rectangle (top, left, ...)
	 */
	public enum Location
	{
		Top, Left, Bottom, Right
	}

	// ------------------------------------------------------------------------
	// alignmentInLevel

	/**
	 * Returns the position of the root node in the diagram.
	 * <p>
	 * By default the root of the tree is located at the top of the diagram.
	 * However one may also put it at the left, right or bottom of the diagram.
	 * <p>
	 * 
	 * 
	 * @return the position of the root node in the diagram
	 */
	Location getRootLocation();

	/**
	 * Possible alignments of a node within a level (centered, towards or away
	 * from root)
	 */
	public enum AlignmentInLevel
	{
		Center, TowardsRoot, AwayFromRoot
	}

	/**
	 * Returns the alignment of "smaller" nodes within a level.
	 * <p>
	 * By default all nodes of one level are centered in the level. However one
	 * may also align them "towards the root" or "away from the root". When the
	 * root is located at the top this means the nodes are aligned "to the top
	 * of the level" or "to the bottom of the level".
	 * 
	 * 
	 * <p>
	 * Of cause the alignment also works when the root is at the bottom or at
	 * the right side.
	 * </p>
	 * 
	 * @return the alignment of "smaller" nodes within a level
	 */
	AlignmentInLevel getAlignmentInLevel();

	// ------------------------------------------------------------------------
	// gapBetweenLevels/Nodes

	/**
	 * Returns the size of the gap between subsequent levels.
	 * 
	 * @param nextLevel
	 *            [nextLevel > 0]
	 * 
	 * @return the size of the gap between level (nextLevel-1) and nextLevel
	 *         [result >= 0]
	 */
	double getGapBetweenLevels(int nextLevel);

	/**
	 * Returns the size of the minimal gap of nodes within a level.
	 * <p>
	 * In the layout there will be a gap of at least the returned size between
	 * both given nodes.
	 * 
	 * node1 and node2 are at the same level and are placed next to each other.
	 * 
	 * @param node1
	 * @param node2
	 * @return the minimal size of the gap between node1 and node2 [result >= 0]
	 */
	double getGapBetweenNodes(TreeNode node1, TreeNode node2);
}
